Daniela Stephania Lombana Garcia
Se recopilan dos conjuntos de datos demográficos y educativos de las APIs:
El análisis de los datos demográficos y educativos en Colombia, tiene como objetivo identificar tendencias y oportunidades relacionadas con los posgrados en el país. Al cruzar esta información, se pueden obtener valiosos insights sobre la distribución geográfica de matriculados, las preferencias de los estudiantes, las variaciones temporales y la identificación de brechas en la oferta y demanda de programas de posgrado.
Nombres del documento: "MEN_MATRICULA_ESTADISTICA_ES"
Este conjunto de datos abarca el período desde 2015 hasta 2020 y proporciona información relevante sobre la matrícula en instituciones de educación superior en Colombia. Fue suministrado por el Ministerio de Educación Nacional y contiene detalles como la última actualización, vistas, descargas, licencia, entre otros. Además, consta de las siguientes características:
Cada fila representa una estadística de matrícula en educación superior con oferta educativa.
Más detalles en la URL de documentación -> (http://www.mineducacion.gov.co/sistemasdeinformacion/1735/w3-propertyname-2672.html)
En la siguiente imagen se observa la busqueda correspondiente:
Open Refine - Para la limpieza de datos del documento: "MEN_MATRICULA_ESTADISTICA_ES"
1. Para el presente documento, es necesario restringir la información exclusivamente a posgrados (Especialización, Maestría y Doctorado), excluyendo cualquier registro correspondiente a pregrado. En este contexto, el campo ID_NIVEL está dividido en '1' para pregrado y '2' para posgrados; por lo tanto, procederemos a filtrar únicamente los posgrados.
Estos ajustes en el documento facilitan la obtención de la información necesaria para la consolidación de datos.
2. Se realizó una conversión del número a letras, asignando el valor '2' al campo de 'Posgrados' y cambiando el nombre del campo ID_NIVEL a NIVEL_ACADEMICO.
Se debe cambiar el tipo de la variable de la celda; inicialmente era un entero (int), pero ahora debe cambiarse a texto.
3. En la ID_METODOLOGIA se buscó información sobre la escala en la metodología y se obtuvo lo siguiente:
Modalidad 1: Presencial. Implica asistir a clases en un centro educativo donde se ofrecen ciclos formativos de grado básico, medio y superior.
Modalidad 2: Dual. Los estudiantes combinan la formación teórica en el aula con la práctica en una empresa. El primer año se realiza en el centro educativo y el segundo año en la empresa, aplicable a ciclos de grado medio y superior.
Modalidad 3: Distancia. Permite estudiar de manera flexible con clases en línea y autoaprendizaje, accesibles en cualquier lugar y hora.
Modalidad 4: Modalidad mixta. Algunos proyectos educativos permiten asistir a clases tanto presenciales como virtuales simultáneamente. Esta modalidad combina flexibilidad y herramientas para el desarrollo académico.
Se realizará el cambio de "Modalidad mixta" a "Dual" y se modificarán los números por letras en la columna denominada "MODALIDAD".
Se debe cambiar el tipo de la variable de la celda; inicialmente era un entero (int), pero ahora debe cambiarse a texto.
4. En el nivel de formación se identificaron diferentes códigos que corresponden a diferentes tipos de programas educativos:
Cada uno de ellos será convertido de números a letras y su título será 'NIVEL_DE_FORMACIÓN'.
Se debe cambiar el tipo de la variable de la celda; inicialmente era un entero (int), pero ahora debe cambiarse a texto.
5. Finalmente, se cambian los títulos de las columnas, eliminando comas, tildes, espacios y otros elementos, para evitar errores al realizar el análisis.
Nombre del documento: "Programas"
Este informe contiene datos de caracterización del registro calificado del programa académico de educación superior, gestionado por la Subdirección de Aseguramiento de la Calidad de la Educación Superior a través del sistema SACES (Soporte al Aseguramiento de la Calidad de la Educación Superior). Además, consta de las siguientes características:
Cada fila representa una estadística de total de programas en educación superior.
Se seleccionaron los siguientes filtros para la búsqueda efectiva:
Más detalles en la URL de documentación -> (https://hecaa.mineducacion.gov.co/consultaspublicas/programas)
En la siguiente imagen se observa la busqueda correspondiente:
Open Refine - Para la limpieza de datos del documento: "Programas"
1. Se obvervan varias columnas vacias (Sin información), por lo que se procede a eliminar las siguientes: REGISTRO_UNICO, JUSTIFICACION, JUSTIFICACION_DETALLADA, VIGENCIA TRANSITORIA y OBSERVACIÓN DECRETO 1174/23.
2. Se aplicó un filtro a la columna (CARÁCTER_ACADÉMICO), seleccionando únicamente las universidades de Colombia.
Posteriormente, identificamos 6.370 registros que contenían el carácter académico ‘universidad’. Para preservar únicamente estos datos, marcamos con banderas aquellos que incluían ‘universidad’ y excluimos los demás. Luego, para eliminar los registros no deseados, aplicamos el filtro ‘facet by blank’, accedimos a la opción ‘All’ en la parte superior de la columna y seleccionamos ‘Edit rows’ -> ‘Remove matching rows’.
3. En el ámbito de la formación, se requieren varios cambios. En primer lugar, se observa que el término ‘universitario’ hace referencia a una especialización, por lo que se sugiere editar su nombre para que se incluya en el grupo de ‘Especialización universitaria’.
Por otro lado, se han identificado diversas especializaciones, por lo que se propone unificarlas bajo la categoría de ‘Especialización universitaria’.
Cabe mencionar que solo se considerarán especializaciones, maestrías y doctorados, ya que nos enfocamos exclusivamente en posgrados.
4. Al igual que en el punto anterior, actualmente se presentan tres modalidades: dual, presencial y virtual. Para facilitar su análisis, se propone unificarlas en grupos.
5. Se procede a modificar los títulos de las columnas clave, considerando que son idénticos al documento de Datos Abiertos Colombia, excepto que uno tenía un nombre diferente al otro.
Finalmente, se cambian los títulos de las columnas, eliminando comas, tildes, espacios y otros elementos, para evitar errores al realizar el análisis.
Se emplean bibliotecas para la integración de datos provenientes de diversas fuentes y formatos en los conjuntos de datos trabajados en el punto anterior, con el fin de realizar una combinación entre dos conjuntos de datos (usando Pandas).
Para lograrlo, seguimos los siguientes pasos:
1. Se importa la biblioteca pandas para poder leer conjuntos de datos desde GitHub
import pandas as pd
url = 'https://raw.githubusercontent.com/DanielaLombana27/proyecto/main/programas.csv'
El primer conjunto de datos se llamará 'programas'.
programas = pd.read_csv(url)
programas
| IES_PADRE | CODIGO_INSTITUCION | NOMBRE_INSTITUCION | ESTADO_INSTITUCION | CARACTER_ACADEMICO | SECTOR | CODIGO_SNIES_DEL_PROGRAMA | CODIGO_ANTERIOR_ICFES | NOMBRE_DEL_PROGRAMA | TITULO_OTORGADO | ... | MODALIDAD | NUMERO_CREDITOS | NUMERO_PERIODOS_DE_DURACION | PERIODICIDAD | SE_OFRECE_POR_CICLOS_PROPEDEUT | PERIODICIDAD_ADMISIONES | PROGRAMA_EN_CONVENIO | DEPARTAMENTO_OFERTA_PROGRAMA | MUNICIPIO_OFERTA_PROGRAMA | COSTO_MATRICULA_ESTUD_NUEVOS | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 52729.0 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | Presencial | 135.0 | 8.0 | Semestral | No | Semestral | N | Bogotá, D.C. | Bogotá, D.C. | 10424920.0 |
| 1 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 107164 | 107164.0 | DOCTORADO EN ADMINISTRACIÓN | DOCTOR(A) EN ADMINISTRACIÓN | ... | Presencial | 135.0 | 8.0 | Semestral | No | Semestral | N | Bogotá, D.C. | Bogotá, D.C. | 8908265.0 |
| 2 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 55123 | 55123.0 | DOCTORADO EN AGROECOLOGÍA | DOCTOR EN AGROECOLOGÍA | ... | Presencial | 120.0 | 8.0 | Semestral | No | Anual | N | Bogotá, D.C. | Bogotá, D.C. | 9558260.0 |
| 3 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 55186 | 55186.0 | DOCTORADO EN ANTROPOLOGIA | DOCTOR EN ANTROPOLOGIA | ... | Presencial | 149.0 | 8.0 | Semestral | No | Semestral | N | Bogotá, D.C. | Bogotá, D.C. | 10424920.0 |
| 4 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52727 | 52727.0 | DOCTORADO EN ARTE Y ARQUITECTURA | DOCTOR EN ARTE Y ARQUITECTURA | ... | Presencial | 140.0 | 8.0 | Semestral | No | NaN | N | Bogotá, D.C. | Bogotá, D.C. | 10424920.0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 6365 | 1735 | 9122 | UNIVERSIDAD MANUELA BELTRAN-UMB- | Activa | Universidad | Privado | 54252 | 54252.0 | ESPECIALIZACION EN INVESTIGACION CRIMINAL | ESPECIALISTA EN INVESTIGACION CRIMINAL | ... | Presencial | NaN | 2.0 | Semestral | No | Sin definir | N | Santander | Bucaramanga | 10041545.0 |
| 6366 | 1735 | 9122 | UNIVERSIDAD MANUELA BELTRAN-UMB- | Activa | Universidad | Privado | 54805 | 54805.0 | ESPECIALIZACION EN INVESTIGACION CRIMINAL | ESPECIALISTA EN INVESTIGACION CRIMINAL | ... | Presencial | 30.0 | 2.0 | Semestral | No | Semestral | N | Santander | Bucaramanga | NaN |
| 6367 | 1735 | 9122 | UNIVERSIDAD MANUELA BELTRAN-UMB- | Activa | Universidad | Privado | 109316 | 109316.0 | ESPECIALIZACION EN SEGURIDAD Y SALUD EN EL TRA... | ESPECIALISTA EN SEGURIDAD Y SALUD EN EL TRABAJO | ... | Presencial | 30.0 | 2.0 | Semestral | No | Trimestral | N | Santander | Bucaramanga | 9129236.0 |
| 6368 | 1735 | 9122 | UNIVERSIDAD MANUELA BELTRAN-UMB- | Activa | Universidad | Privado | 106358 | 106358.0 | MAESTRÍA EN SEGURIDAD Y SALUD EN EL TRABAJO | MAGÍSTER EN SEGURIDAD Y SALUD EN EL TRABAJO | ... | Presencial | 50.0 | 4.0 | Periodos | No | Por cohorte | N | Santander | Bucaramanga | 11006852.0 |
| 6369 | 1101 | 9933 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 116706 | NaN | Especialización en Interculturalidad y Gestión... | Especialista en Interculturalidad y Gestión Te... | ... | Presencial | 24.0 | 2.0 | Semestral | No | Anual | N | Cesar | La Paz | NaN |
6370 rows × 35 columns
url = 'https://raw.githubusercontent.com/DanielaLombana27/proyecto/main/matriculas.csv'
El segundo conjunto de datos se llamará 'matriculas'.
matriculas = pd.read_csv(url)
<ipython-input-6-907d7dcc43ef>:1: DtypeWarning: Columns (16) have mixed types. Specify dtype option on import or set low_memory=False. matriculas = pd.read_csv(url)
matriculas
| CODIGO_INSTITUCION | IES_PADRE | NOMBRE_INSTITUCION | PRICIPAL_O_SECCIONAL | ID_SECTOR | ID_CARACTER | CODIGO_DEPARTAMENTO | DEPARTAMENTO | CODIGO_MUNICIPIO | MUNICIPIO | ... | ID_NUCLEO | NUCLEO_BÁSICO_DEL_CONOCIMIENTO | CODIGO_DEPARTAMENTO_PROGRAMA | DEPARTAMENTO_OFERTA_PROGRAMA | CODIGO_MUNICIPIO_PROGRAMA | MUNICIPIO_OFERTA_PROGRAMA | ID_GENERO | YEAR | SEMESTRE | TOTAL_MATRICULADOS | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | PRINCIPAL | 1 | 4 | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 2 |
| 1 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | PRINCIPAL | 1 | 4 | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 1 | 2015 | 1 | 20 |
| 2 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | PRINCIPAL | 1 | 4 | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 6 |
| 3 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | PRINCIPAL | 1 | 4 | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 1 | 2015 | 1 | 4 |
| 4 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | PRINCIPAL | 1 | 4 | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 3 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 57028 | 9926 | 9926 | FUNDACION UNIVERSITARIA INTERNACIONAL DE LA RI... | Principal | 2 | 3 | 11 | Bogotá D.C. | 11001 | Bogotá D.C. | ... | 69 | Administración | 11 | Bogotá D.C. | 11001 | Bogotá D.C. | 2 | 2020 | 1 | 12 |
| 57029 | 9927 | 9927 | INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... | Principal | 1 | 3 | 5 | Antioquia | 5001 | Medellín | ... | 827 | Ingeniería de sistemas telemática y afines | 5 | Antioquia | 5001 | Medellín | 1 | 2020 | 1 | 4 |
| 57030 | 9927 | 9927 | INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... | Principal | 1 | 3 | 5 | Antioquia | 5001 | Medellín | ... | 827 | Ingeniería de sistemas telemática y afines | 5 | Antioquia | 5001 | Medellín | 2 | 2020 | 1 | 1 |
| 57031 | 9927 | 9927 | INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... | Principal | 1 | 3 | 5 | Antioquia | 5001 | Medellín | ... | 69 | Administración | 5 | Antioquia | 5001 | Medellín | 1 | 2020 | 1 | 25 |
| 57032 | 9927 | 9927 | INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... | Principal | 1 | 3 | 5 | Antioquia | 5001 | Medellín | ... | 69 | Administración | 5 | Antioquia | 5001 | Medellín | 2 | 2020 | 1 | 20 |
57033 rows × 26 columns
Se imprime los nombres de las columnas de cada DataSet's
print(programas.columns)
print(matriculas.columns)
Index(['IES_PADRE', 'CODIGO_INSTITUCION', 'NOMBRE_INSTITUCION',
'ESTADO_INSTITUCION', 'CARACTER_ACADEMICO', 'SECTOR',
'CODIGO_SNIES_DEL_PROGRAMA', 'CODIGO_ANTERIOR_ICFES',
'NOMBRE_DEL_PROGRAMA', 'TITULO_OTORGADO', 'ESTADO_PROGRAMA',
'RECONOCIMIENTO_DEL_MINISTERIO', 'RESOLUCION_DE_APROBACION',
'FECHA_DE_RESOLUCION', 'FECHA_EJECUTORIA', 'VIGENCIA_AÑOS',
'FECHA_DE_REGISTRO_EN_SNIES', 'YEAR', 'CINE_F_2013_AC_CAMPO_AMPLIO',
'CINE_F_2013_AC_CAMPO_ESPECIFIC', 'CINE_F_2013_AC_CAMPO_DETALLADO',
'AREA_DE_CONOCIMIENTO', 'NUCLEO_BASICO_DEL_CONOCIMIENTO',
'NIVEL_ACADEMICO', 'NIVEL_DE_FORMACION', 'MODALIDAD', 'NUMERO_CREDITOS',
'NUMERO_PERIODOS_DE_DURACION', 'PERIODICIDAD',
'SE_OFRECE_POR_CICLOS_PROPEDEUT', 'PERIODICIDAD_ADMISIONES',
'PROGRAMA_EN_CONVENIO', 'DEPARTAMENTO_OFERTA_PROGRAMA',
'MUNICIPIO_OFERTA_PROGRAMA', 'COSTO_MATRICULA_ESTUD_NUEVOS'],
dtype='object')
Index(['CODIGO_INSTITUCION', 'IES_PADRE', 'NOMBRE_INSTITUCION',
'PRICIPAL_O_SECCIONAL', 'ID_SECTOR', 'ID_CARACTER',
'CODIGO_DEPARTAMENTO', 'DEPARTAMENTO', 'CODIGO_MUNICIPIO', 'MUNICIPIO',
'MUNICIPIO_OFERTA', 'NOMBRE_DEL_PROGRAMA', 'NIVEL_ACADEMICO',
'NIVEL_FORMACION', 'METODOLOGIA', 'ID_AREA', 'ID_NUCLEO',
'NUCLEO_BÁSICO_DEL_CONOCIMIENTO', 'CODIGO_DEPARTAMENTO_PROGRAMA',
'DEPARTAMENTO_OFERTA_PROGRAMA', 'CODIGO_MUNICIPIO_PROGRAMA',
'MUNICIPIO_OFERTA_PROGRAMA', 'ID_GENERO', 'YEAR', 'SEMESTRE',
'TOTAL_MATRICULADOS'],
dtype='object')
Para una mejor visualización de los datos, podemos utilizar el método head() para mostrar los primeros 5 registros y el tail() para ver los ultimos 5 registros.
programas.head()
| IES_PADRE | CODIGO_INSTITUCION | NOMBRE_INSTITUCION | ESTADO_INSTITUCION | CARACTER_ACADEMICO | SECTOR | CODIGO_SNIES_DEL_PROGRAMA | CODIGO_ANTERIOR_ICFES | NOMBRE_DEL_PROGRAMA | TITULO_OTORGADO | ... | MODALIDAD | NUMERO_CREDITOS | NUMERO_PERIODOS_DE_DURACION | PERIODICIDAD | SE_OFRECE_POR_CICLOS_PROPEDEUT | PERIODICIDAD_ADMISIONES | PROGRAMA_EN_CONVENIO | DEPARTAMENTO_OFERTA_PROGRAMA | MUNICIPIO_OFERTA_PROGRAMA | COSTO_MATRICULA_ESTUD_NUEVOS | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 52729.0 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | Presencial | 135.0 | 8.0 | Semestral | No | Semestral | N | Bogotá, D.C. | Bogotá, D.C. | 10424920.0 |
| 1 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 107164 | 107164.0 | DOCTORADO EN ADMINISTRACIÓN | DOCTOR(A) EN ADMINISTRACIÓN | ... | Presencial | 135.0 | 8.0 | Semestral | No | Semestral | N | Bogotá, D.C. | Bogotá, D.C. | 8908265.0 |
| 2 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 55123 | 55123.0 | DOCTORADO EN AGROECOLOGÍA | DOCTOR EN AGROECOLOGÍA | ... | Presencial | 120.0 | 8.0 | Semestral | No | Anual | N | Bogotá, D.C. | Bogotá, D.C. | 9558260.0 |
| 3 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 55186 | 55186.0 | DOCTORADO EN ANTROPOLOGIA | DOCTOR EN ANTROPOLOGIA | ... | Presencial | 149.0 | 8.0 | Semestral | No | Semestral | N | Bogotá, D.C. | Bogotá, D.C. | 10424920.0 |
| 4 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52727 | 52727.0 | DOCTORADO EN ARTE Y ARQUITECTURA | DOCTOR EN ARTE Y ARQUITECTURA | ... | Presencial | 140.0 | 8.0 | Semestral | No | NaN | N | Bogotá, D.C. | Bogotá, D.C. | 10424920.0 |
5 rows × 35 columns
programas.tail()
| IES_PADRE | CODIGO_INSTITUCION | NOMBRE_INSTITUCION | ESTADO_INSTITUCION | CARACTER_ACADEMICO | SECTOR | CODIGO_SNIES_DEL_PROGRAMA | CODIGO_ANTERIOR_ICFES | NOMBRE_DEL_PROGRAMA | TITULO_OTORGADO | ... | MODALIDAD | NUMERO_CREDITOS | NUMERO_PERIODOS_DE_DURACION | PERIODICIDAD | SE_OFRECE_POR_CICLOS_PROPEDEUT | PERIODICIDAD_ADMISIONES | PROGRAMA_EN_CONVENIO | DEPARTAMENTO_OFERTA_PROGRAMA | MUNICIPIO_OFERTA_PROGRAMA | COSTO_MATRICULA_ESTUD_NUEVOS | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 6365 | 1735 | 9122 | UNIVERSIDAD MANUELA BELTRAN-UMB- | Activa | Universidad | Privado | 54252 | 54252.0 | ESPECIALIZACION EN INVESTIGACION CRIMINAL | ESPECIALISTA EN INVESTIGACION CRIMINAL | ... | Presencial | NaN | 2.0 | Semestral | No | Sin definir | N | Santander | Bucaramanga | 10041545.0 |
| 6366 | 1735 | 9122 | UNIVERSIDAD MANUELA BELTRAN-UMB- | Activa | Universidad | Privado | 54805 | 54805.0 | ESPECIALIZACION EN INVESTIGACION CRIMINAL | ESPECIALISTA EN INVESTIGACION CRIMINAL | ... | Presencial | 30.0 | 2.0 | Semestral | No | Semestral | N | Santander | Bucaramanga | NaN |
| 6367 | 1735 | 9122 | UNIVERSIDAD MANUELA BELTRAN-UMB- | Activa | Universidad | Privado | 109316 | 109316.0 | ESPECIALIZACION EN SEGURIDAD Y SALUD EN EL TRA... | ESPECIALISTA EN SEGURIDAD Y SALUD EN EL TRABAJO | ... | Presencial | 30.0 | 2.0 | Semestral | No | Trimestral | N | Santander | Bucaramanga | 9129236.0 |
| 6368 | 1735 | 9122 | UNIVERSIDAD MANUELA BELTRAN-UMB- | Activa | Universidad | Privado | 106358 | 106358.0 | MAESTRÍA EN SEGURIDAD Y SALUD EN EL TRABAJO | MAGÍSTER EN SEGURIDAD Y SALUD EN EL TRABAJO | ... | Presencial | 50.0 | 4.0 | Periodos | No | Por cohorte | N | Santander | Bucaramanga | 11006852.0 |
| 6369 | 1101 | 9933 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 116706 | NaN | Especialización en Interculturalidad y Gestión... | Especialista en Interculturalidad y Gestión Te... | ... | Presencial | 24.0 | 2.0 | Semestral | No | Anual | N | Cesar | La Paz | NaN |
5 rows × 35 columns
matriculas.head()
| CODIGO_INSTITUCION | IES_PADRE | NOMBRE_INSTITUCION | PRICIPAL_O_SECCIONAL | ID_SECTOR | ID_CARACTER | CODIGO_DEPARTAMENTO | DEPARTAMENTO | CODIGO_MUNICIPIO | MUNICIPIO | ... | ID_NUCLEO | NUCLEO_BÁSICO_DEL_CONOCIMIENTO | CODIGO_DEPARTAMENTO_PROGRAMA | DEPARTAMENTO_OFERTA_PROGRAMA | CODIGO_MUNICIPIO_PROGRAMA | MUNICIPIO_OFERTA_PROGRAMA | ID_GENERO | YEAR | SEMESTRE | TOTAL_MATRICULADOS | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | PRINCIPAL | 1 | 4 | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 2 |
| 1 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | PRINCIPAL | 1 | 4 | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 1 | 2015 | 1 | 20 |
| 2 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | PRINCIPAL | 1 | 4 | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 6 |
| 3 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | PRINCIPAL | 1 | 4 | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 1 | 2015 | 1 | 4 |
| 4 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | PRINCIPAL | 1 | 4 | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 3 |
5 rows × 26 columns
matriculas.tail()
| CODIGO_INSTITUCION | IES_PADRE | NOMBRE_INSTITUCION | PRICIPAL_O_SECCIONAL | ID_SECTOR | ID_CARACTER | CODIGO_DEPARTAMENTO | DEPARTAMENTO | CODIGO_MUNICIPIO | MUNICIPIO | ... | ID_NUCLEO | NUCLEO_BÁSICO_DEL_CONOCIMIENTO | CODIGO_DEPARTAMENTO_PROGRAMA | DEPARTAMENTO_OFERTA_PROGRAMA | CODIGO_MUNICIPIO_PROGRAMA | MUNICIPIO_OFERTA_PROGRAMA | ID_GENERO | YEAR | SEMESTRE | TOTAL_MATRICULADOS | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 57028 | 9926 | 9926 | FUNDACION UNIVERSITARIA INTERNACIONAL DE LA RI... | Principal | 2 | 3 | 11 | Bogotá D.C. | 11001 | Bogotá D.C. | ... | 69 | Administración | 11 | Bogotá D.C. | 11001 | Bogotá D.C. | 2 | 2020 | 1 | 12 |
| 57029 | 9927 | 9927 | INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... | Principal | 1 | 3 | 5 | Antioquia | 5001 | Medellín | ... | 827 | Ingeniería de sistemas telemática y afines | 5 | Antioquia | 5001 | Medellín | 1 | 2020 | 1 | 4 |
| 57030 | 9927 | 9927 | INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... | Principal | 1 | 3 | 5 | Antioquia | 5001 | Medellín | ... | 827 | Ingeniería de sistemas telemática y afines | 5 | Antioquia | 5001 | Medellín | 2 | 2020 | 1 | 1 |
| 57031 | 9927 | 9927 | INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... | Principal | 1 | 3 | 5 | Antioquia | 5001 | Medellín | ... | 69 | Administración | 5 | Antioquia | 5001 | Medellín | 1 | 2020 | 1 | 25 |
| 57032 | 9927 | 9927 | INSTITUCION UNIVERSITARIA DIGITAL DE ANTIOQUIA... | Principal | 1 | 3 | 5 | Antioquia | 5001 | Medellín | ... | 69 | Administración | 5 | Antioquia | 5001 | Medellín | 2 | 2020 | 1 | 20 |
5 rows × 26 columns
2. Combinar los datos en función de la columna 'IES_PADRE'
datos_combinados = pd.merge(programas, matriculas, on='IES_PADRE', how='inner')
3. Imprimir los datos combinados
datos_combinados
| IES_PADRE | CODIGO_INSTITUCION_x | NOMBRE_INSTITUCION_x | ESTADO_INSTITUCION | CARACTER_ACADEMICO | SECTOR | CODIGO_SNIES_DEL_PROGRAMA | CODIGO_ANTERIOR_ICFES | NOMBRE_DEL_PROGRAMA_x | TITULO_OTORGADO | ... | ID_NUCLEO | NUCLEO_BÁSICO_DEL_CONOCIMIENTO | CODIGO_DEPARTAMENTO_PROGRAMA | DEPARTAMENTO_OFERTA_PROGRAMA_y | CODIGO_MUNICIPIO_PROGRAMA | MUNICIPIO_OFERTA_PROGRAMA_y | ID_GENERO | YEAR_y | SEMESTRE | TOTAL_MATRICULADOS | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 5.272900e+04 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 2 |
| 1 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 5.272900e+04 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 1 | 2015 | 1 | 20 |
| 2 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 5.272900e+04 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 6 |
| 3 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 5.272900e+04 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 1 | 2015 | 1 | 4 |
| 4 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 5.272900e+04 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 3 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 6849574 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 559 | Derecho y afines | 13 | Bolívar | 13001 | Cartagena de Indias | 2 | 2020 | 1 | 4 |
| 6849575 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 69 | Administración | 13 | Bolívar | 13001 | Cartagena de Indias | 1 | 2020 | 1 | 15 |
| 6849576 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 69 | Administración | 13 | Bolívar | 13001 | Cartagena de Indias | 2 | 2020 | 1 | 4 |
| 6849577 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 833 | Otras ingenierías | 13 | Bolívar | 13001 | Cartagena de Indias | 1 | 2020 | 1 | 7 |
| 6849578 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 833 | Otras ingenierías | 13 | Bolívar | 13001 | Cartagena de Indias | 2 | 2020 | 1 | 1 |
6849579 rows × 60 columns
Para este punto, es necesario emplear bibliotecas de Análisis de Series Temporales.
Se deben generar al menos dos gráficos que utilicen la información de los conjuntos de datos anteriores, utilizando las bibliotecas mencionadas en clase.
Biliotecas
Se importa la biblioteca Pandas y se carga los datos. Estos nos permite tener una mejor manipulación de los datos.
import pandas as pd
posgrados = datos_combinados
posgrados.columns
Index(['IES_PADRE', 'CODIGO_INSTITUCION_x', 'NOMBRE_INSTITUCION_x',
'ESTADO_INSTITUCION', 'CARACTER_ACADEMICO', 'SECTOR',
'CODIGO_SNIES_DEL_PROGRAMA', 'CODIGO_ANTERIOR_ICFES',
'NOMBRE_DEL_PROGRAMA_x', 'TITULO_OTORGADO', 'ESTADO_PROGRAMA',
'RECONOCIMIENTO_DEL_MINISTERIO', 'RESOLUCION_DE_APROBACION',
'FECHA_DE_RESOLUCION', 'FECHA_EJECUTORIA', 'VIGENCIA_AÑOS',
'FECHA_DE_REGISTRO_EN_SNIES', 'YEAR_x', 'CINE_F_2013_AC_CAMPO_AMPLIO',
'CINE_F_2013_AC_CAMPO_ESPECIFIC', 'CINE_F_2013_AC_CAMPO_DETALLADO',
'AREA_DE_CONOCIMIENTO', 'NUCLEO_BASICO_DEL_CONOCIMIENTO',
'NIVEL_ACADEMICO_x', 'NIVEL_DE_FORMACION', 'MODALIDAD',
'NUMERO_CREDITOS', 'NUMERO_PERIODOS_DE_DURACION', 'PERIODICIDAD',
'SE_OFRECE_POR_CICLOS_PROPEDEUT', 'PERIODICIDAD_ADMISIONES',
'PROGRAMA_EN_CONVENIO', 'DEPARTAMENTO_OFERTA_PROGRAMA_x',
'MUNICIPIO_OFERTA_PROGRAMA_x', 'COSTO_MATRICULA_ESTUD_NUEVOS',
'CODIGO_INSTITUCION_y', 'NOMBRE_INSTITUCION_y', 'PRICIPAL_O_SECCIONAL',
'ID_SECTOR', 'ID_CARACTER', 'CODIGO_DEPARTAMENTO', 'DEPARTAMENTO',
'CODIGO_MUNICIPIO', 'MUNICIPIO', 'MUNICIPIO_OFERTA',
'NOMBRE_DEL_PROGRAMA_y', 'NIVEL_ACADEMICO_y', 'NIVEL_FORMACION',
'METODOLOGIA', 'ID_AREA', 'ID_NUCLEO', 'NUCLEO_BÁSICO_DEL_CONOCIMIENTO',
'CODIGO_DEPARTAMENTO_PROGRAMA', 'DEPARTAMENTO_OFERTA_PROGRAMA_y',
'CODIGO_MUNICIPIO_PROGRAMA', 'MUNICIPIO_OFERTA_PROGRAMA_y', 'ID_GENERO',
'YEAR_y', 'SEMESTRE', 'TOTAL_MATRICULADOS'],
dtype='object')
2. Verificar la información básica del DataFrame:
posgrados.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 6849579 entries, 0 to 6849578 Data columns (total 60 columns): # Column Dtype --- ------ ----- 0 IES_PADRE int64 1 CODIGO_INSTITUCION_x int64 2 NOMBRE_INSTITUCION_x object 3 ESTADO_INSTITUCION object 4 CARACTER_ACADEMICO object 5 SECTOR object 6 CODIGO_SNIES_DEL_PROGRAMA int64 7 CODIGO_ANTERIOR_ICFES float64 8 NOMBRE_DEL_PROGRAMA_x object 9 TITULO_OTORGADO object 10 ESTADO_PROGRAMA object 11 RECONOCIMIENTO_DEL_MINISTERIO object 12 RESOLUCION_DE_APROBACION float64 13 FECHA_DE_RESOLUCION object 14 FECHA_EJECUTORIA object 15 VIGENCIA_AÑOS object 16 FECHA_DE_REGISTRO_EN_SNIES object 17 YEAR_x int64 18 CINE_F_2013_AC_CAMPO_AMPLIO object 19 CINE_F_2013_AC_CAMPO_ESPECIFIC object 20 CINE_F_2013_AC_CAMPO_DETALLADO object 21 AREA_DE_CONOCIMIENTO object 22 NUCLEO_BASICO_DEL_CONOCIMIENTO object 23 NIVEL_ACADEMICO_x object 24 NIVEL_DE_FORMACION object 25 MODALIDAD object 26 NUMERO_CREDITOS float64 27 NUMERO_PERIODOS_DE_DURACION float64 28 PERIODICIDAD object 29 SE_OFRECE_POR_CICLOS_PROPEDEUT object 30 PERIODICIDAD_ADMISIONES object 31 PROGRAMA_EN_CONVENIO object 32 DEPARTAMENTO_OFERTA_PROGRAMA_x object 33 MUNICIPIO_OFERTA_PROGRAMA_x object 34 COSTO_MATRICULA_ESTUD_NUEVOS float64 35 CODIGO_INSTITUCION_y int64 36 NOMBRE_INSTITUCION_y object 37 PRICIPAL_O_SECCIONAL object 38 ID_SECTOR int64 39 ID_CARACTER int64 40 CODIGO_DEPARTAMENTO int64 41 DEPARTAMENTO object 42 CODIGO_MUNICIPIO int64 43 MUNICIPIO object 44 MUNICIPIO_OFERTA int64 45 NOMBRE_DEL_PROGRAMA_y object 46 NIVEL_ACADEMICO_y object 47 NIVEL_FORMACION object 48 METODOLOGIA object 49 ID_AREA int64 50 ID_NUCLEO object 51 NUCLEO_BÁSICO_DEL_CONOCIMIENTO object 52 CODIGO_DEPARTAMENTO_PROGRAMA int64 53 DEPARTAMENTO_OFERTA_PROGRAMA_y object 54 CODIGO_MUNICIPIO_PROGRAMA int64 55 MUNICIPIO_OFERTA_PROGRAMA_y object 56 ID_GENERO int64 57 YEAR_y int64 58 SEMESTRE int64 59 TOTAL_MATRICULADOS object dtypes: float64(5), int64(16), object(39) memory usage: 3.1+ GB
3. Se puede filtrar datos exactos.
# Filtrar programas que están en un estado específico
programas_activos = posgrados[posgrados['ESTADO_PROGRAMA'] == 'Activo']
programas_activos
| IES_PADRE | CODIGO_INSTITUCION_x | NOMBRE_INSTITUCION_x | ESTADO_INSTITUCION | CARACTER_ACADEMICO | SECTOR | CODIGO_SNIES_DEL_PROGRAMA | CODIGO_ANTERIOR_ICFES | NOMBRE_DEL_PROGRAMA_x | TITULO_OTORGADO | ... | ID_NUCLEO | NUCLEO_BÁSICO_DEL_CONOCIMIENTO | CODIGO_DEPARTAMENTO_PROGRAMA | DEPARTAMENTO_OFERTA_PROGRAMA_y | CODIGO_MUNICIPIO_PROGRAMA | MUNICIPIO_OFERTA_PROGRAMA_y | ID_GENERO | YEAR_y | SEMESTRE | TOTAL_MATRICULADOS | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 5.272900e+04 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 2 |
| 1 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 5.272900e+04 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 1 | 2015 | 1 | 20 |
| 2 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 5.272900e+04 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 6 |
| 3 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 5.272900e+04 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 1 | 2015 | 1 | 4 |
| 4 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 5.272900e+04 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 3 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 6849574 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 559 | Derecho y afines | 13 | Bolívar | 13001 | Cartagena de Indias | 2 | 2020 | 1 | 4 |
| 6849575 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 69 | Administración | 13 | Bolívar | 13001 | Cartagena de Indias | 1 | 2020 | 1 | 15 |
| 6849576 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 69 | Administración | 13 | Bolívar | 13001 | Cartagena de Indias | 2 | 2020 | 1 | 4 |
| 6849577 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 833 | Otras ingenierías | 13 | Bolívar | 13001 | Cartagena de Indias | 1 | 2020 | 1 | 7 |
| 6849578 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 833 | Otras ingenierías | 13 | Bolívar | 13001 | Cartagena de Indias | 2 | 2020 | 1 | 1 |
6849579 rows × 60 columns
4. Se puede agrupar y agregar datos
# Contar la cantidad de programas por año
conteo_por_año = posgrados.groupby('YEAR_y').size()
conteo_por_año
YEAR_y 2015 1002070 2016 1096330 2017 1144787 2018 1172944 2019 1220241 2020 1213207 dtype: int64
# Se agrupa el DataFrame por la columna 'METODOLOGIA' y se cuentan los registros en cada grupo
agrupacion_modalidad = posgrados.groupby('METODOLOGIA')
agrupacion_modalidad.count()
| IES_PADRE | CODIGO_INSTITUCION_x | NOMBRE_INSTITUCION_x | ESTADO_INSTITUCION | CARACTER_ACADEMICO | SECTOR | CODIGO_SNIES_DEL_PROGRAMA | CODIGO_ANTERIOR_ICFES | NOMBRE_DEL_PROGRAMA_x | TITULO_OTORGADO | ... | ID_NUCLEO | NUCLEO_BÁSICO_DEL_CONOCIMIENTO | CODIGO_DEPARTAMENTO_PROGRAMA | DEPARTAMENTO_OFERTA_PROGRAMA_y | CODIGO_MUNICIPIO_PROGRAMA | MUNICIPIO_OFERTA_PROGRAMA_y | ID_GENERO | YEAR_y | SEMESTRE | TOTAL_MATRICULADOS | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| METODOLOGIA | |||||||||||||||||||||
| Dual | 116378 | 116378 | 116378 | 116378 | 116378 | 116378 | 116378 | 92712 | 116378 | 116378 | ... | 116378 | 116378 | 116378 | 116378 | 116378 | 116378 | 116378 | 116378 | 116378 | 116378 |
| Presencial | 6445057 | 6445057 | 6445057 | 6445057 | 6445057 | 6445057 | 6445057 | 6090049 | 6445057 | 6445057 | ... | 6445057 | 6445057 | 6445057 | 6445057 | 6445057 | 6445057 | 6445057 | 6445057 | 6445057 | 6445057 |
| Virtual | 288144 | 288144 | 288144 | 288144 | 288144 | 288144 | 288144 | 230431 | 288144 | 288144 | ... | 288144 | 288144 | 288144 | 288144 | 288144 | 288144 | 288144 | 288144 | 288144 | 288144 |
3 rows × 59 columns
Estas bibliotecas nos permiten realizar gráficos de acuerdo a los datos proporcionados.
Ejemplo 1
Este código es útil para realizar un análisis inicial de los datos agrupados por año y modalidad, así como para calcular un total de registros por año.
Se importan las bibliotecas.
import pandas as pd
import matplotlib.pyplot as plt
Se agrupan y se realiza un conteo de registros por año y modalidad.
registros_por_modalidad_y_year = posgrados.groupby(['YEAR_x', 'MODALIDAD']).size().unstack()
Se agrega una columna 'Total' que contiene la suma de registros por cada año.
registros_por_modalidad_y_year['Total'] = registros_por_modalidad_y_year.sum(axis=1)
Finalmente, se imprime el dataframe resultante.
registros_por_modalidad_y_year
| MODALIDAD | Dual | Presencial | Virtual | Total |
|---|---|---|---|---|
| YEAR_x | ||||
| 1998 | 2570.0 | 941010.0 | 8303.0 | 951883.0 |
| 1999 | NaN | 77841.0 | 5552.0 | 83393.0 |
| 2000 | NaN | 77847.0 | 9487.0 | 87334.0 |
| 2001 | NaN | 79826.0 | 2347.0 | 82173.0 |
| 2002 | NaN | 184157.0 | 335.0 | 184492.0 |
| 2003 | NaN | 210995.0 | 1627.0 | 212622.0 |
| 2004 | NaN | 36412.0 | 506.0 | 36918.0 |
| 2005 | NaN | 112180.0 | 226.0 | 112406.0 |
| 2006 | NaN | 67713.0 | 6615.0 | 74328.0 |
| 2007 | NaN | 248117.0 | 10150.0 | 258267.0 |
| 2008 | 1005.0 | 129322.0 | 1169.0 | 131496.0 |
| 2009 | NaN | 112856.0 | 8727.0 | 121583.0 |
| 2010 | NaN | 223506.0 | 6963.0 | 230469.0 |
| 2011 | NaN | 98962.0 | 1036.0 | 99998.0 |
| 2012 | NaN | 159776.0 | 5854.0 | 165630.0 |
| 2013 | 1005.0 | 153483.0 | 20296.0 | 174784.0 |
| 2014 | 3528.0 | 194055.0 | 12338.0 | 209921.0 |
| 2015 | 2290.0 | 226834.0 | 22025.0 | 251149.0 |
| 2016 | 638.0 | 149840.0 | 11019.0 | 161497.0 |
| 2017 | 3076.0 | 209363.0 | 10569.0 | 223008.0 |
| 2018 | NaN | 362933.0 | 20639.0 | 383572.0 |
| 2019 | 5728.0 | 546420.0 | 46858.0 | 599006.0 |
| 2020 | 1511.0 | 295859.0 | 59743.0 | 357113.0 |
| 2021 | 4792.0 | 411268.0 | 69515.0 | 485575.0 |
| 2022 | 4901.0 | 210320.0 | 49919.0 | 265140.0 |
| 2023 | 38255.0 | 490373.0 | 152782.0 | 681410.0 |
| 2024 | 18681.0 | 131628.0 | 74103.0 | 224412.0 |
Para grafícar los resultados de la tabla, se debe realizar los siguientes pasos:
1. Se importan las bibliotecas.
2. Se agrupan y se realiza un conteo de registros por año y modalidad.
3. Se realiza una iteración sobre cada modalidad para graficar la evolución de la cantidad de registros para cada modalidad. Luego, se configura:
Por ultimo, se hace la activación de la cuadrícula en el gráfico, para mejor análisis.
import pandas as pd
import matplotlib.pyplot as plt
registros_por_modalidad_y_anio = posgrados.groupby(['YEAR_x', 'MODALIDAD']).size().unstack()
plt.figure(figsize=(12, 6))
for modalidad in registros_por_modalidad_y_anio.columns:
plt.plot(registros_por_modalidad_y_anio.index, registros_por_modalidad_y_anio[modalidad], marker='o', label=modalidad)
plt.title('Evolución de la Cantidad de Registros por Modalidad')
plt.xlabel('Año')
plt.ylabel('Cantidad de Registros')
plt.xticks(registros_por_modalidad_y_anio.index[::2])
plt.legend(title='Modalidad', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid(True)
plt.ylim(bottom=0.5)
plt.tight_layout()
plt.show()
Conclusión:
El gráfico de líneas titulado "Evolución de la Cantidad de Registros por Modalidad" muestra un cambio significativo en el número de registros en diversas modalidades educativas desde 1998 hasta 2024. En 1998, se contabilizaban aproximadamente 900,000 registros presenciales, 8,000 registros virtuales y 2,000 registros en modalidad dual. Para el año 2024, los registros presenciales han disminuido notablemente a alrededor de 130,000, mientras que las modalidades virtual y dual han experimentado un incremento significativo, con aproximadamente 74,000 y 18,000 registros respectivamente, en comparación con los datos de 1998. Este cambio puede atribuirse en parte a la pandemia de COVID-19 en 2020, que redujo los registros presenciales y fomentó la adopción de modalidades virtuales y duales por parte de las instituciones educativas. Además, este aumento podría estar relacionado con la creciente utilización de tecnologías de la información y comunicación (TIC) para mejorar la accesibilidad y flexibilidad de la educación.
Ejemplo 2
Este código muestra cada departamento con la cantidad de programas únicos que ofrece, facilitando así la comprensión de la distribución de programas entre diferentes departamentos.
Se realiza la agrupación y conteo de programas únicos por departamento.
programas_por_departamento = posgrados.groupby('DEPARTAMENTO_OFERTA_PROGRAMA_x')['NOMBRE_DEL_PROGRAMA_x'].nunique().reset_index()
Se renombran las columnas del DataFrame resultante.
programas_por_departamento.columns = ['Departamento', 'Cantidad de programas']
Por último, se imprime el DataFrame resultante.
programas_por_departamento
| Departamento | Cantidad de programas | |
|---|---|---|
| 0 | Amazonas | 4 |
| 1 | Antioquia | 800 |
| 2 | Arauca | 3 |
| 3 | Archipiélago de San Andrés, Providencia y Sant... | 5 |
| 4 | Atlántico | 375 |
| 5 | Bogotá, D.C. | 1680 |
| 6 | Bolívar | 217 |
| 7 | Boyacá | 172 |
| 8 | Caldas | 231 |
| 9 | Caquetá | 17 |
| 10 | Casanare | 14 |
| 11 | Cauca | 114 |
| 12 | Cesar | 41 |
| 13 | Chocó | 13 |
| 14 | Cundinamarca | 129 |
| 15 | Córdoba | 92 |
| 16 | Huila | 75 |
| 17 | La Guajira | 23 |
| 18 | Magdalena | 91 |
| 19 | Meta | 65 |
| 20 | Nariño | 121 |
| 21 | Norte de Santander | 122 |
| 22 | Putumayo | 3 |
| 23 | Quindío | 62 |
| 24 | Risaralda | 136 |
| 25 | Santander | 340 |
| 26 | Sucre | 11 |
| 27 | Tolima | 95 |
| 28 | Valle del Cauca | 499 |
| 29 | Vaupés | 1 |
Para grafícar los resultados de la tabla, se debe realizar los siguientes pasos:
1. Se importan las bibliotecas.
2. Se ordena el DataFrame por la cantidad de programas de forma descendente y se configura el estilo de seaborn.
3. Se crea una figura para el gráfico con tamaño específico y se genera el gráfico de barras utilizando seaborn. Luego, se configuran:
Finalmente, se ajusta el diseño del gráfico para mejorar la distribución y se muestra en pantalla.
import matplotlib.pyplot as plt
import seaborn as sns
programas_por_departamento = programas_por_departamento.sort_values(by='Cantidad de programas', ascending=False)
sns.set(style="whitegrid")
plt.figure(figsize=(12, 8))
bars = sns.barplot(x='Departamento', y='Cantidad de programas', data=programas_por_departamento, palette=sns.color_palette("husl", len(programas_por_departamento)))
plt.title('Cantidad de Programas de Posgrado por Departamento')
plt.xlabel('Departamento')
plt.ylabel('Cantidad de Programas')
bars.set_xticklabels(bars.get_xticklabels(), rotation=45, ha='right', fontsize=10)
plt.tight_layout()
plt.show()
<ipython-input-29-21844777684b>:8: FutureWarning:
Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.
bars = sns.barplot(x='Departamento', y='Cantidad de programas', data=programas_por_departamento, palette=sns.color_palette("husl", len(programas_por_departamento)))
<ipython-input-29-21844777684b>:13: UserWarning: FixedFormatter should only be used together with FixedLocator
bars.set_xticklabels(bars.get_xticklabels(), rotation=45, ha='right', fontsize=10)
Conclusión:
El gráfico "Cantidad de Programas de Posgrado por Departamento" revela una variabilidad significativa en la oferta de programas posgraduales entre los departamentos colombianos. Por ejemplo, Bogotá D.C. cuenta con más de 1,600 programas, mientras que Vaupés tiene solo 1, siendo el menor número de todos. Esta disparidad puede explicarse por el tamaño del departamento, sus recursos financieros y académicos, así como las demandas del mercado laboral local. Este análisis es crucial para que los estudiantes puedan seleccionar el departamento más adecuado según sus intereses académicos, subrayando la importancia de políticas educativas que fomenten una distribución equitativa de programas posgraduales en todo el país.
Daniela Stephania Lombana Garcia
Para iniciar, se instala la biblioteca Scipy que ofrece herramientas y algoritmos matemáticos.
pip install scipy
Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (1.13.1) Requirement already satisfied: numpy<2.3,>=1.22.4 in /usr/local/lib/python3.10/dist-packages (from scipy) (1.26.4)
Se importa la biblioteca que incluye el paquete Stats para estadísticas.
import scipy.stats as stats
Se importan los datos de muestra generados en la actividad anterior, denominados datos combinados y extraer la columna de interés.
El dropna es para eliminar valores NaN si los hay.
datos_muestra = datos_combinados['NUMERO_CREDITOS'].dropna()
Se formulan las hipótesis nula y alternativa.
Realicemos una prueba t de la muestra.
estadistico_t, valor_p = stats.ttest_1samp(datos_muestra, 60.5)
print(f"Estadístico t: {estadistico_t}")
print(f"Valor p: {valor_p}")
Estadístico t: 1.5216414043130821 Valor p: 0.1280990037842468
Conclusión: Dado que el valor p (0.128) es mayor que 0.05, no se cuenta con suficiente evidencia para rechazar la hipótesis nula. Por lo tanto, no se puede concluir que la media de los datos de la muestra sea significativamente diferente de 60.5.
Por otro lado, se puede determinar el intervalo de confianza del 95% para la media del número de créditos en los datos y a visualizar la distribución de estos créditos.
Se importa la biblioteca numpy y matplotlib para realizar cálculos numéricos y crear visualizaciones gráficas.
import numpy as np
import matplotlib.pyplot as plt
Se calcula la media y el intervalo de confianza.
def calcular_intervalo_confianza(datos, confianza=0.95):
media = np.mean(datos)
sem = stats.sem(datos)
intervalo = stats.t.interval(confianza, len(datos) - 1, loc=media, scale=sem)
return media, intervalo
media_creditos, intervalo_confianza = calcular_intervalo_confianza(datos_muestra)
Se visualiza los resultados.
print(f"Media del número de créditos: {media_creditos:.2f}")
print(f'Intervalo de confianza (95%) para la media de créditos: {intervalo_confianza}')
Media del número de créditos: 60.53 Intervalo de confianza (95%) para la media de créditos: (60.49094551718293, 60.57191989542532)
Por último, se genera un histograma para visualizar la distribución del número de créditos.
plt.figure(figsize=(10, 6))
plt.hist(datos_muestra, bins=range(int(min(datos_muestra)), int(max(datos_muestra)) + 2), edgecolor='black')
plt.axvline(media_creditos, color='red', linestyle='dashed', linewidth=1, label=f'Promedio: {media_creditos:.2f}')
plt.axvline(intervalo_confianza[0], color='green', linestyle='dashed', linewidth=1, label='Límite Inferior del IC')
plt.axvline(intervalo_confianza[1], color='green', linestyle='dashed', linewidth=1, label='Límite Superior del IC')
plt.xlabel('Número de Créditos')
plt.ylabel('Frecuencia')
plt.title('Distribución del Número de Créditos')
plt.legend()
plt.show()
confidence = 0.95
print(f"Con un nivel de confianza del {confidence*100}%, se estima que el número de créditos promedio en la población estudiantil es de {intervalo_confianza[0]:.1f} a {intervalo_confianza[1]:.1f}.")
Con un nivel de confianza del 95.0%, se estima que el número de créditos promedio en la población estudiantil es de 60.5 a 60.6.
El análisis de varianza (ANOVA) es una técnica estadística que se utiliza para verificar si las medias de dos o más grupos son significativamente diferentes entre sí. ANOVA verifica el impacto de uno o más factores al comparar las medias de diferentes muestras.
Se importa la biblioteca que incluye el paquete Stats para estadísticas.
import scipy.stats as stats
Se filtrar los valores NaN en las columnas de NUMERO_CREDITOS y MODALIDAD. Luego, se agruparon los datos por modalidad y se convirtieron las series resultantes en listas.
datos_num= datos_combinados[['NUMERO_CREDITOS', 'MODALIDAD']].dropna()
grupos = datos_num.groupby('MODALIDAD')['NUMERO_CREDITOS'].apply(list)
grupos
MODALIDAD Dual [40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.... Presencial [135.0, 135.0, 135.0, 135.0, 135.0, 135.0, 135... Virtual [28.0, 28.0, 28.0, 28.0, 28.0, 28.0, 28.0, 28.... Name: NUMERO_CREDITOS, dtype: object
Presencial = grupos.get('Presencial', [])
Virtual = grupos.get('Virtual', [])
Dual = grupos.get('Dual', [])
Se formulan las hipótesis nula y alternativa.
Hipótesis nula: las medias de todos los grupos son iguales.
Hipótesis alternativa: al menos una media de grupo es diferente de las demás.
Realicemos una prueba ANOVA de una vía.
estadistico_f, valor_p = stats.f_oneway(Presencial, Virtual, Dual)
print(f"Estadístico F: {estadistico_f}")
print(f"Valor p: {valor_p}")
Estadístico F: 87481.3450827921 Valor p: 0.0
Conclusion: Dado que el valor p es inferior al nivel de significancia de 0.05, rechazamos la hipótesis nula. Esto indica que hay diferencias estadísticamente significativas en las medias de número de creditos entre al menos dos de las modalidades (Presencial, Virtual y Dual). Por lo tanto, podemos concluir que el número de créditos varía significativamente entre estas modalidades.
En este ejercicio, se llevará a cabo un análisis de regresión lineal para investigar la relación entre el número de créditos de un programa académico y el costo de matrícula para estudiantes nuevos. El objetivo es determinar cómo varía el costo de matrícula en función del número de créditos del programa, utilizando datos proporcionados en el conjunto de datos datos_combinados.
Se importan las librerías necesarias para el análisis:
Pandas: para manipulación y análisis de datos.
NumPy: para cálculos numéricos y operaciones matemáticas.
Matplotlib: para la creación de gráficos y visualizaciones.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
Se eliminan los valores NaN en las columnas NUMERO_CREDITOS y COSTO_MATRICULA_ESTUD_NUEVOS.
datos_filtrados = datos_combinados[['NUMERO_CREDITOS', 'COSTO_MATRICULA_ESTUD_NUEVOS']].dropna()
Se obtiene los datos de las columnas.
X = datos_filtrados['NUMERO_CREDITOS'].values
y = datos_filtrados['COSTO_MATRICULA_ESTUD_NUEVOS'].values
Descripción de variables:
X: Lista que contiene el número de créditos de los programas académicos. Esta variable se utiliza como predictor o variable independiente en el análisis.
Y: Lista que representa el costo de matrícula para estudiantes nuevos. Esta variable es la respuesta o variable dependiente que se intenta predecir en función del número de créditos.
Añadir el término de intercepción a X
X_ones = np.c_[np.ones(len(X)), X]
Se calcula los parámetros del modelo (regresión lineal).
beta = np.linalg.inv(X_ones.T.dot(X_ones)).dot(X_ones.T).dot(y)
print(f'Parámetros del modelo (beta): {beta}')
Parámetros del modelo (beta): [9883921.78944088 43562.81870339]
Se grafíca los datos y la línea de regresión.
plt.figure(figsize=(10, 6))
plt.scatter(X, y, s=40, c='#FF0000', label='Datos')
X_lim = [X.min(), X.max()]
X_lim_ones = np.c_[np.ones(2), X_lim]
y_lim = X_lim_ones.dot(beta)
plt.plot(X_lim, y_lim, 'g-', label='Línea de Regresión')
# Configurar el gráfico
plt.xlabel('Número de Créditos')
plt.ylabel('Costo de Matrícula Estudiantes Nuevos')
plt.title('Número de Créditos vs Costo de Matrícula Estudiantes Nuevos')
plt.legend()
plt.grid()
plt.show()
Conclusión: El gráfico muestra que no parece haber una relación clara entre el número de créditos y el costo de matrícula de los estudiantes nuevos. Los puntos están muy dispersos y no siguen un patrón específico. La línea de tendencia es casi plana, lo que sugiere que el número de créditos no afecta mucho el costo de matrícula. En general, parece que el costo de matrícula no depende mucho del número de créditos que toman los estudiantes.
Se predice el costo de matrícula para un número dado de créditos.
numero_creditos_nuevo = 40
costo_matricula_pred = beta[0] + (beta[1] * numero_creditos_nuevo)
# Usando f-string con formato para miles
print(f'El costo de matrícula calculado para {numero_creditos_nuevo} créditos es: ${costo_matricula_pred:,.2f}')
El costo de matrícula calculado para 40 créditos es: $11,626,434.54
El objetivo de este análisis es aplicar PCA a datos de programas educativos, caracterizados por variables como el número de créditos, duración, costo, matriculados y vigencia. Usaremos PCA para reducir la dimensionalidad y visualizar cómo estas variables se relacionan y se agrupan en un espacio de dos dimensiones. Para ello podemos seguir los siguientes pasos:
PASO 1. Se impota las librerías.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
PASO 2. Preparar los datos
Se selecciona las variables numéricas para el análisis.
variables = ['NUMERO_CREDITOS', 'NUMERO_PERIODOS_DE_DURACION', 'COSTO_MATRICULA_ESTUD_NUEVOS', 'TOTAL_MATRICULADOS', 'VIGENCIA_AÑOS']
Se extrae las columnas seleccionadas.
datos_seleccionados = datos_combinados[variables]
Se verifica los tipos de datos.
print(datos_seleccionados.dtypes)
NUMERO_CREDITOS float64 NUMERO_PERIODOS_DE_DURACION float64 COSTO_MATRICULA_ESTUD_NUEVOS float64 TOTAL_MATRICULADOS object VIGENCIA_AÑOS object dtype: object
PASO 3. Convertir datos a numérico y limpiar.
Se convierten las columnas a tipo numérico, manejando los errores y los datos en formato texto.
for column in datos_seleccionados.columns:
if datos_seleccionados[column].dtype == 'object':
datos_seleccionados[column] = datos_seleccionados[column].str.replace(',', '.', regex=False)
datos_seleccionados[column] = pd.to_numeric(datos_seleccionados[column], errors='coerce')
<ipython-input-56-29eec8ba173a>:3: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
datos_seleccionados[column] = datos_seleccionados[column].str.replace(',', '.', regex=False)
<ipython-input-56-29eec8ba173a>:4: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
datos_seleccionados[column] = pd.to_numeric(datos_seleccionados[column], errors='coerce')
Se elimina las filas con valores nulos.
datos_seleccionados = datos_seleccionados.dropna()
datos_seleccionados.dtypes
NUMERO_CREDITOS float64 NUMERO_PERIODOS_DE_DURACION float64 COSTO_MATRICULA_ESTUD_NUEVOS float64 TOTAL_MATRICULADOS float64 VIGENCIA_AÑOS float64 dtype: object
datos_seleccionados.head()
| NUMERO_CREDITOS | NUMERO_PERIODOS_DE_DURACION | COSTO_MATRICULA_ESTUD_NUEVOS | TOTAL_MATRICULADOS | VIGENCIA_AÑOS | |
|---|---|---|---|---|---|
| 0 | 135.0 | 8.0 | 10424920.0 | 2.0 | 8.0 |
| 1 | 135.0 | 8.0 | 10424920.0 | 20.0 | 8.0 |
| 2 | 135.0 | 8.0 | 10424920.0 | 6.0 | 8.0 |
| 3 | 135.0 | 8.0 | 10424920.0 | 4.0 | 8.0 |
| 4 | 135.0 | 8.0 | 10424920.0 | 3.0 | 8.0 |
PASO 4. Normalizar los datos
Se normaliza los datos.
scaler = StandardScaler()
datos_scaled = scaler.fit_transform(datos_seleccionados)
PASO 5. Aplicar PCA
pca = PCA(n_components=2)
pca_resultados = pca.fit_transform(datos_scaled)
PASO 6. Crear un DataFrame para los resultados de PCA.
df_pca = pd.DataFrame(data=pca_resultados, columns=['Componente Principal 1', 'Componente Principal 2'])
Paso 7. Visualizar los resultados del PCA.
plt.figure(figsize=(10, 6))
sns.scatterplot(x='Componente Principal 1', y='Componente Principal 2', data=df_pca, alpha=0.5)
plt.title('Resultados de PCA - Análisis Multivariante de Programas')
plt.xlabel('Componente Principal 1')
plt.ylabel('Componente Principal 2')
plt.grid(True)
plt.show()
Conclusiones:
El gráfico de PCA muestra cómo los programas educativos se distribuyen en función de dos componentes principales. La mayoría de los puntos se agrupan en una región central, lo que indica que muchos programas tienen características similares en términos de créditos, duración, costo, matriculados y vigencia. Sin embargo, también se observan algunos puntos dispersos fuera del grupo principal, lo que sugiere que hay programas con características únicas o diferentes. Estos puntos dispersos pueden indicar variabilidad en las características de ciertos programas educativos que no son comunes en la mayoría de los casos.
Se importan las librerías.
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
Para una mejor visualización de los datos, podemos utilizar el método head() para mostrar los primeros 5 registros y el tail() para ver los ultimos 5 registros.
datos_combinados.head()
| IES_PADRE | CODIGO_INSTITUCION_x | NOMBRE_INSTITUCION_x | ESTADO_INSTITUCION | CARACTER_ACADEMICO | SECTOR | CODIGO_SNIES_DEL_PROGRAMA | CODIGO_ANTERIOR_ICFES | NOMBRE_DEL_PROGRAMA_x | TITULO_OTORGADO | ... | ID_NUCLEO | NUCLEO_BÁSICO_DEL_CONOCIMIENTO | CODIGO_DEPARTAMENTO_PROGRAMA | DEPARTAMENTO_OFERTA_PROGRAMA_y | CODIGO_MUNICIPIO_PROGRAMA | MUNICIPIO_OFERTA_PROGRAMA_y | ID_GENERO | YEAR_y | SEMESTRE | TOTAL_MATRICULADOS | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 52729.0 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 2 |
| 1 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 52729.0 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 1 | 2015 | 1 | 20 |
| 2 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 52729.0 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 6 |
| 3 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 52729.0 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 1 | 2015 | 1 | 4 |
| 4 | 1101 | 1101 | UNIVERSIDAD NACIONAL DE COLOMBIA | Activa | Universidad | Oficial | 52729 | 52729.0 | DOCTORADO EN INGENIERIA DE SISTEMAS Y COMPUTA... | DOCTOR EN INGENIERIA | ... | 445 | MEDICINA | 11 | BOGOTA D.C. | 11001 | BOGOTA D.C. | 2 | 2015 | 1 | 3 |
5 rows × 60 columns
Warning: Total number of columns (60) exceeds max_columns (20) limiting to first (20) columns.
datos_combinados.tail()
| IES_PADRE | CODIGO_INSTITUCION_x | NOMBRE_INSTITUCION_x | ESTADO_INSTITUCION | CARACTER_ACADEMICO | SECTOR | CODIGO_SNIES_DEL_PROGRAMA | CODIGO_ANTERIOR_ICFES | NOMBRE_DEL_PROGRAMA_x | TITULO_OTORGADO | ... | ID_NUCLEO | NUCLEO_BÁSICO_DEL_CONOCIMIENTO | CODIGO_DEPARTAMENTO_PROGRAMA | DEPARTAMENTO_OFERTA_PROGRAMA_y | CODIGO_MUNICIPIO_PROGRAMA | MUNICIPIO_OFERTA_PROGRAMA_y | ID_GENERO | YEAR_y | SEMESTRE | TOTAL_MATRICULADOS | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 6849574 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 559 | Derecho y afines | 13 | Bolívar | 13001 | Cartagena de Indias | 2 | 2020 | 1 | 4 |
| 6849575 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 69 | Administración | 13 | Bolívar | 13001 | Cartagena de Indias | 1 | 2020 | 1 | 15 |
| 6849576 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 69 | Administración | 13 | Bolívar | 13001 | Cartagena de Indias | 2 | 2020 | 1 | 4 |
| 6849577 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 833 | Otras ingenierías | 13 | Bolívar | 13001 | Cartagena de Indias | 1 | 2020 | 1 | 7 |
| 6849578 | 9105 | 9105 | ESCUELA NAVAL DE CADETES ALMIRANTE PADILLA | Activa | Universidad | Oficial | 21547 | 9.105655e+20 | MAESTRIA EN OCEANOGRAFÍA | MAGISTER EN OCEANOGRAFÍA | ... | 833 | Otras ingenierías | 13 | Bolívar | 13001 | Cartagena de Indias | 2 | 2020 | 1 | 1 |
5 rows × 60 columns
Warning: Total number of columns (60) exceeds max_columns (20) limiting to first (20) columns.
datos_combinados.columns
Index(['IES_PADRE', 'CODIGO_INSTITUCION_x', 'NOMBRE_INSTITUCION_x',
'ESTADO_INSTITUCION', 'CARACTER_ACADEMICO', 'SECTOR',
'CODIGO_SNIES_DEL_PROGRAMA', 'CODIGO_ANTERIOR_ICFES',
'NOMBRE_DEL_PROGRAMA_x', 'TITULO_OTORGADO', 'ESTADO_PROGRAMA',
'RECONOCIMIENTO_DEL_MINISTERIO', 'RESOLUCION_DE_APROBACION',
'FECHA_DE_RESOLUCION', 'FECHA_EJECUTORIA', 'VIGENCIA_AÑOS',
'FECHA_DE_REGISTRO_EN_SNIES', 'YEAR_x', 'CINE_F_2013_AC_CAMPO_AMPLIO',
'CINE_F_2013_AC_CAMPO_ESPECIFIC', 'CINE_F_2013_AC_CAMPO_DETALLADO',
'AREA_DE_CONOCIMIENTO', 'NUCLEO_BASICO_DEL_CONOCIMIENTO',
'NIVEL_ACADEMICO_x', 'NIVEL_DE_FORMACION', 'MODALIDAD',
'NUMERO_CREDITOS', 'NUMERO_PERIODOS_DE_DURACION', 'PERIODICIDAD',
'SE_OFRECE_POR_CICLOS_PROPEDEUT', 'PERIODICIDAD_ADMISIONES',
'PROGRAMA_EN_CONVENIO', 'DEPARTAMENTO_OFERTA_PROGRAMA_x',
'MUNICIPIO_OFERTA_PROGRAMA_x', 'COSTO_MATRICULA_ESTUD_NUEVOS',
'CODIGO_INSTITUCION_y', 'NOMBRE_INSTITUCION_y', 'PRICIPAL_O_SECCIONAL',
'ID_SECTOR', 'ID_CARACTER', 'CODIGO_DEPARTAMENTO', 'DEPARTAMENTO',
'CODIGO_MUNICIPIO', 'MUNICIPIO', 'MUNICIPIO_OFERTA',
'NOMBRE_DEL_PROGRAMA_y', 'NIVEL_ACADEMICO_y', 'NIVEL_FORMACION',
'METODOLOGIA', 'ID_AREA', 'ID_NUCLEO', 'NUCLEO_BÁSICO_DEL_CONOCIMIENTO',
'CODIGO_DEPARTAMENTO_PROGRAMA', 'DEPARTAMENTO_OFERTA_PROGRAMA_y',
'CODIGO_MUNICIPIO_PROGRAMA', 'MUNICIPIO_OFERTA_PROGRAMA_y', 'ID_GENERO',
'YEAR_y', 'SEMESTRE', 'TOTAL_MATRICULADOS'],
dtype='object')
Se define las columnas con las que desea trabajar para el análisis de correlación.
columnas_requeridas = ['NUMERO_CREDITOS', 'NUMERO_PERIODOS_DE_DURACION', 'COSTO_MATRICULA_ESTUD_NUEVOS', 'TOTAL_MATRICULADOS']
nuevo_data = datos_combinados[columnas_requeridas].replace({'0': np.nan, '': np.nan})
nuevo_data.head()
| NUMERO_CREDITOS | NUMERO_PERIODOS_DE_DURACION | COSTO_MATRICULA_ESTUD_NUEVOS | TOTAL_MATRICULADOS | |
|---|---|---|---|---|
| 0 | 135.0 | 8.0 | 10424920.0 | 2 |
| 1 | 135.0 | 8.0 | 10424920.0 | 20 |
| 2 | 135.0 | 8.0 | 10424920.0 | 6 |
| 3 | 135.0 | 8.0 | 10424920.0 | 4 |
| 4 | 135.0 | 8.0 | 10424920.0 | 3 |
Se realiza las transformaciones necesarias como conversión de tipos y manejo de valores nulos.
nuevo_data['NUMERO_CREDITOS'] = pd.to_numeric(nuevo_data['NUMERO_CREDITOS'], errors='coerce')
nuevo_data['NUMERO_PERIODOS_DE_DURACION'] = pd.to_numeric(nuevo_data['NUMERO_PERIODOS_DE_DURACION'], errors='coerce')
nuevo_data['COSTO_MATRICULA_ESTUD_NUEVOS'] = pd.to_numeric(nuevo_data['COSTO_MATRICULA_ESTUD_NUEVOS'], errors='coerce')
nuevo_data['TOTAL_MATRICULADOS'] = pd.to_numeric(nuevo_data['TOTAL_MATRICULADOS'], errors='coerce')
nuevo_data = nuevo_data.dropna(subset = columnas_requeridas)
nuevo_data
| NUMERO_CREDITOS | NUMERO_PERIODOS_DE_DURACION | COSTO_MATRICULA_ESTUD_NUEVOS | TOTAL_MATRICULADOS | |
|---|---|---|---|---|
| 0 | 135.0 | 8.0 | 10424920.0 | 2.0 |
| 1 | 135.0 | 8.0 | 10424920.0 | 20.0 |
| 2 | 135.0 | 8.0 | 10424920.0 | 6.0 |
| 3 | 135.0 | 8.0 | 10424920.0 | 4.0 |
| 4 | 135.0 | 8.0 | 10424920.0 | 3.0 |
| ... | ... | ... | ... | ... |
| 6849574 | 57.0 | 4.0 | 9280000.0 | 4.0 |
| 6849575 | 57.0 | 4.0 | 9280000.0 | 15.0 |
| 6849576 | 57.0 | 4.0 | 9280000.0 | 4.0 |
| 6849577 | 57.0 | 4.0 | 9280000.0 | 7.0 |
| 6849578 | 57.0 | 4.0 | 9280000.0 | 1.0 |
5552001 rows × 4 columns
Utilizamos el dtypes para verificar rápidamente qué tipo de datos tiene cada columna.
nuevo_data.dtypes
NUMERO_CREDITOS float64 NUMERO_PERIODOS_DE_DURACION float64 COSTO_MATRICULA_ESTUD_NUEVOS float64 TOTAL_MATRICULADOS float64 dtype: object
Tambien se puede utilizar el count para contar el número de valores no nulos en cada columna del DataFrame.
nuevo_data.count()
NUMERO_CREDITOS 5552001 NUMERO_PERIODOS_DE_DURACION 5552001 COSTO_MATRICULA_ESTUD_NUEVOS 5552001 TOTAL_MATRICULADOS 5552001 dtype: int64
Se puede calcular la correlación entre dos columnas específicas del DataFrame.
correlation = nuevo_data['COSTO_MATRICULA_ESTUD_NUEVOS'].corr(nuevo_data['NUMERO_CREDITOS'])
print(f'Correlación entre Costo de estudiantes matriculados y Número de créditos: {correlation}')
Correlación entre Costo de estudiantes matriculados y Número de créditos: 0.32364517667598025
Conclusión: La correlación entre el costo de estudiantes matriculados y el número de créditos es de aproximadamente 0.32. Esto sugiere una correlación positiva débil. En otras palabras, hay una relación ligera entre el costo de los estudiantes matriculados y el número de créditos; a medida que uno aumenta, el otro tiende a aumentar también, pero la relación no es muy fuerte.
Se utiliza Scatter plot para visualizar la relación entre dos variables.
plt.scatter(nuevo_data['COSTO_MATRICULA_ESTUD_NUEVOS'], nuevo_data['NUMERO_CREDITOS'], color = 'red')
plt.title('Relación entre Costo de estudiantes matriculados y Número de créditos', fontweight='bold')
plt.xlabel('Costo de estudiantes matriculados', fontweight='bold')
plt.ylabel('Número de créditos', fontweight='bold')
plt.show()
Conclusión: El gráfico muestra que no hay una relación clara entre el costo de matrícula y el número de créditos cursados por los estudiantes. La dispersión de los datos y la falta de una tendencia lineal indican que el costo de matrícula no tiene un impacto directo en el número de créditos que los estudiantes eligen tomar. Sin embargo, es posible que, en casos donde los estudiantes inscriban créditos adicionales, el aumento en el número de créditos del programa pueda estar asociado con un incremento en el costo de matrícula.
Daniela Stephania Lombana Garcia
En está entrega se utilizó Python, para desarrollar un web scraper con el objetivo de extraer información sobre graduados en Colombia, tanto de pregrados como de posgrados, desde fuentes web específicas.
Para gestionar estos datos, se configuró inicialmente un entorno local con XAMPP y luego los migró a la nube a través de Clever Cloud. Se creó una base de datos llamada grados_pre_pos con una tabla graduados, estructurando así la información obtenida de manera organizada y llevó a cabo un análisis detallado y sistemático de los datos extraídos de la tabla web.
Además, se identificó un párrafo relevante en un documento sobre posgrados en Colombia. Utilizando herramientas como Google Colab.
En primer lugar, se empleó Python para extraer información relevante (Título, parrafo, autor, etc.) de una página web que analiza las tendencias de estudios de posgrado en Colombia. Para este propósito, se implementó el siguiente código:
Se importan las librerías.
import requests
from bs4 import BeautifulSoup
import time
Se agregan las variables iniciales.
url: La URL de la página web desde donde se extraerán los datos.
archivo_datos: Nombre del archivo donde se guardarán los datos extraídos.
url = 'https://www.unisabana.edu.co/portaldenoticias/al-dia/la-tendencia-de-los-estudios-de-posgrado-en-colombia/'
archivo_datos = 'datos_extraidos_parrafo.txt'
El bloque try-except se emplea para ejecutar el código principal de manera segura, capturando y manejando posibles errores durante la solicitud HTTP (requests.get(url)), el parsing con BeautifulSoup, la manipulación de datos y la escritura en archivo. Además, se proporciona retroalimentación al usuario mostrando el progreso y mensajes de error o éxito en la extracción de datos. Se añade un pequeño retardo (time.sleep(1)) entre solicitudes para no sobrecargar el servidor.
try:
result = requests.get(url)
if result.status_code == 200:
soup = BeautifulSoup(result.text, 'html.parser')
titulo = soup.find('title').get_text(strip=True)
print('Título:', titulo)
parrafos = soup.find_all('p')
if parrafos:
contenido_parrafo = '\n'.join([p.get_text(strip=True) for p in parrafos])
print('Contenido del párrafo:\n', contenido_parrafo)
with open(archivo_datos, 'w', encoding='utf-8') as file:
file.write('Título: ' + titulo + '\n\n')
file.write('Contenido del párrafo:\n\n' + contenido_parrafo + '\n')
else:
print('No se encontraron párrafos en la página.')
else:
print(f'Error al acceder a {url}: Código de estado {result.status_code}')
time.sleep(1)
except Exception as e:
print(f'Ocurrió un error al procesar {url}: {e}')
Título: Conozca la tendencia de los estudios de posgrado en Colombia Contenido del párrafo: Por Jorge David Páez Monroy, director General del Instituto Forum. De acuerdo con los comportamientos y las cifras que se observan en el Sistema de Información del Ministerio de Educación Nacional, y con los resultados en el crecimiento de programas de formación posgradual en las universidades, la tendencia sigue siendo hacia especializaciones y maestrías de profundización innovadoras, que estén en diálogo con las necesidades empresariales y que sean pertinentes con la formación de calidad, al atender ejes y competencias que respondan al mercado laboral, entre las cuales se deben tener en cuenta las formas de pensar para la resolución de problemas con creatividad y de manera ágil, así como la forma de enseñar a convivir en el mundo con responsabilidad personal y social, articulándose con la ciudadanía global. Programas con mecanismos para integrarse al mundo, como las tecnologías digitales, la información y el manejo eficiente de los datos, y con relacionamiento colaborativo para la construcción conjunta de nuevo conocimiento que lleve al crecimiento del país. Es importante tener en nuestro país posgrados virtuales, presenciales o la combinación de los anteriores. Se puede decir que las especializaciones, maestrías y MBA favorecen la adquisición de nuevas competencias, de manera ágil y contundente, para afrontar los requerimientos del mercado laboral y las competencias tan apetecidas por los empresarios, por lo cual son tan atractivas para estudiantes jóvenes que desean contar con conocimientos, capacidades y actitudes para competir en esta cuarta parte del siglo XXI de manera pertinente. Continúan en crecimiento los posgrados en las áreas de gestión, gerencia y administración. Desde hace varios años se viene observando la tendencia de crecimiento de la formación en posgrados mediante los procesos llevados on line a nivel mundial, dando mayores oportunidades de abrirnos al mundo del conocimiento al romper fronteras, con la posibilidad de acceder a otras culturas y construir alternativas de solución de problemas en el sector productivo de manera colectiva,compartiendo o aprendiendo de las buenas prácticas de la formación posgradual, a partir de nuevas modalidades y metodologías para gestionar y adquirir conocimiento. Colombia lleva varios años en esta modalidad; sin embargo, ha sido tímida en el desarrollo de estos procesos, quizá por la calificación que se le tenía a esta formación “de baja calidad”. Es así como se ha constituido para el país en un reto, pero también en una solución en el modo de educar. Se sabe que, incluso antes de la emergencia sanitaria causada por el COVID-19, los modelos virtuales en la educación superior en Colombia venían desarrollándose en el marco del aseguramiento de la calidad, atendiendo a las demandas globales de la educación superior, tal como lo han solicitado decretos que rigen la educación superior y que, hoy por hoy, se hacen explícitos en el Decreto 1330 del 25 de julio de 2019, en el cual se invita a una realidad de inclusión, equidad y fortalecimiento de la internacionalización, con las condiciones de calidad requeridas para ser competitivos en este tipo de modalidad de formación posgradual. Se puede decir que las especializaciones, maestrías y MBA favorecen la adquisición de nuevas competencias, de manera ágil y contundente, para afrontar los requerimientos del mercado laboral. La formación posgradual de los profesionales a partir de esta modalidad se abre a un mundo de posibilidades. Por un lado, la oportunidad y el espacio de flexibilidad para los estudiantes de posgrado que desean continuar sus estudios con un manejo del tiempo y, por el otro, al garantizarles el poder responder a competencias requeridas por el mercado laboral, que sin duda alguna se dan en su formación, como el manejo de datos en la era digital, las comunicaciones y el conocimiento digitales, la gestión de la información, el trabajo colaborativo y en red. Es muy claro que la educación virtual es todo un modelo de calidad y que, sin duda alguna, con esta oportunidad de formación se fortalecerá el eje de competitividad para el país en la formación del talento humano. La comunidad universitaria de posgrados cambió el paradigma de una clase presencial por la metodología remota o Hyflex, y por unas metodologías en las cuales, tanto quien aprende como quien enseña, toma consciencia de sus propias ideas como un primer paso hacia su transformación y la resolución de problemas reales, en los que se aplique la relevancia práctica en beneficio de las personas, las organizaciones y, por ende, de la sociedad. Para seguir creciendo, el camino es continuar el proceso de evolucionar apoyados en la idea de una universidad de tercera generación, que cuente con un portafolio ágil, un escalamiento del sistema de aprendizaje, una arquitectura para la investigación y que se caracterice por ser una organización innovadora. Esta nueva forma de hacer las cosas es un aprendizaje constante que lleva a un mejoramiento continuo, en donde lo importante es tener claro que las circunstancias cambian lo que hacemos, pero nunca lo que somos. Universidad de La Sabana. Código SNIES 1711Personería Jurídica:Resolución 130 del 14 de enero de 1980. Ministerio de Educación Nacional. Carácter académico: universidad. Síguenos en nuestras redes Sala de PrensaUnidades AcadémicasDonacionesPolítica de Protección de datosPolítica de CookiesProtocolo de atención para casos de acoso, violencia sexual y basada en género, así como de comportamientos que sean contrarios a los principios fundamentales de la Universidad o enfrentan la dignidad de cualquiera de los miembros de la comunidad univesitaria Contacto para notificaciones legales Si tiene alguna notificación legal puede enviarla al correo: notificacioneslegales@unisabana.edu.co Institución de educación superior sujeta a inspección y vigilancia por el Ministerio de Educación Nacional.Copyright 2017. Universidad de La Sabana. Todos los derechos reservados.Campus del Puente del Común, Km. 7, Autopista Norte de Bogotá. Chía, Cundinamarca, Colombia.Contact Center: (601) 861 5555 / 861 6666. Apartado: 53753, Bogotá. Al navegar en este sitio web, usted acepta el uso de cookies y el tratamiento de sus datos personales por parte de la Universidad conforme a su política de cookies y la política de protección de datos personales. En cualquier momento podrá configurar el uso de cookies en su ordenador, y para ejercer sus derechos de protección de datos personales puede hacerlo a través de los canales habilitados como el correoprotecciondedatos@unisabana.edu.coprotecciondedatos@unisabana.edu.co
En segundo lugar, se utilizó otro web scraping para extraer datos de una tabla de una página web relacionada con los graduados de pregrado y posgrado en Colombia de los años 2020 al 2022. Para almacenar y gestionar estos datos, se configuró una base de datos MySQL utilizando XAMPP. A continuación se explica paso a paso:
1. Inicio de MySQL y creación de base de datos:
Para comenzar, se accede a MySQL desde la línea de comandos con el siguiente comando: "mysql -h localhost -u root -p"
Luego, se muestra la lista de bases de datos existentes con: "SHOW DATABASES;"
Para utilizar esta base de datos recién creada, se ejecuta: "USE Graduados_Pre_Pos;"
2. Creación de la tabla graduados: Se define una tabla llamada graduados con las siguientes columnas:
id: Identificador único para cada registro.
vigencia: Año de graduación (2020, 2021, 2022). nombre_facultad: Nombre de la facultad donde se graduaron los estudiantes.
nombre_programa: Nombre del programa académico (carrera, especialización, maestría, etc.).
jornada: Jornada en la que se cursó el programa (diurna, nocturna, etc.).
modalidad: Modalidad de estudio (presencial, virtual, semipresencial, etc.).
no_de_graduados: Número de graduados en esa categoría.
El script SQL para crear esta tabla es el siguiente: "CREATE TABLE graduados ( id INT(11) DEFAULT NULL, vigencia VARCHAR(100) DEFAULT NULL, nombre_facultad VARCHAR(100) DEFAULT NULL, nombre_programa VARCHAR(100) DEFAULT NULL, jornada VARCHAR(100) DEFAULT NULL, modalidad VARCHAR(100) DEFAULT NULL, no_de_graduados INT DEFAULT NULL, PRIMARY KEY (id) );"
3. Descripción de la tabla graduados: Para verificar la estructura de la tabla recién creada y asegurarse de que se han definido correctamente todas las columnas, se utiliza el comando "DESCRIBE graduados;". Esto muestra una descripción detallada de cada columna, incluyendo el tipo de dato y las restricciones de clave primaria.
Después de configurar y crear la estructura de la base de datos MySQL utilizando XAMPP, se desarrolló un código en Python para automatizar la extracción de información desde una API externa.
Este código está diseñado para obtener datos relacionados con los graduados de pregrado y posgrado en Colombia para los años 2020 al 2022. Utilizando las bibliotecas mysql.connector y requests, el script se encarga de realizar solicitudes HTTP a la API, procesar los datos JSON recibidos y almacenarlos en la base de datos MySQL previamente configurada.
La función del código es asegurar que los datos sean recuperados de manera eficiente y organizada, facilitando su posterior análisis y uso dentro de aplicaciones o sistemas de información. A continuación se explica su funcionamiento y propósito:
1. Importación de librerías: Se importan las librerías necesarias, mysql.connector para interactuar con la base de datos MySQL y requests para hacer solicitudes HTTP a la API que contiene los datos.
2. Configuración de la base de datos: Se establecen los parámetros de configuración para la conexión a la base de datos MySQL (host, user, password, database).
3. Consulta SQL para inserción de datos: Se define la consulta SQL (sql_insert) que insertará los datos obtenidos de la API en la tabla graduados.
4. URL de la API: Se especifica la URL de la API (api_url) que proporciona los datos en formato JSON.
5. Función process_row: Esta función procesa cada fila de datos del JSON. Extrae los campos relevantes (vigencia, nombre_facultad, nombre_programa, jornada, modalidad, no_de_graduados), los prepara como una tupla y ejecuta la consulta SQL para insertarlos en la base de datos mediante el cursor.
6. Función process_api: Esta función realiza la solicitud HTTP a la API, procesa los datos JSON obtenidos llamando a process_row para cada fila y finalmente realiza un commit en la base de datos para guardar los cambios.
7. Función principal main: La función principal establece una conexión a la base de datos MySQL, inicializa un cursor y llama a process_api para comenzar el proceso de extracción y almacenamiento de datos.
8. Manejo de errores: El código está diseñado para manejar varios tipos de errores, incluidos errores de solicitud HTTP (requests.RequestException), errores de MySQL (mysql.connector.Error) y cualquier otra excepción general (Exception), proporcionando mensajes específicos para cada caso de error.
El código de python es el siguiente:
# import mysql.connector
# import requests
# Configuración de la base de datos MySQL
# db_config = {
# "host": "localhost",
# "user": "root",
# "password": "",
# "database": "Graduados_Pre_Pos"
# }
# Consulta SQL para insertar datos en la tabla graduados
# sql_insert = """
# INSERT INTO grado (id, vigencia, nombre_facultad, nombre_programa, jornada, modalidad, no_de_graduados)
# VALUES (%s, %s, %s, %s, %s, %s, %s)
# """
# URL de la API que proporciona los datos en formato JSON
# api_url = 'https://www.datos.gov.co/resource/gdwy-s35v.json'
# Función para procesar cada fila de datos del JSON
# def process_row(row, cursor):
# id = int(row['id']) if 'id' in row and row['id'].isdigit() else None
# vigencia = row['vigencia']
# nombre_facultad = row['nombre_facultad']
# nombre_programa = row['nombre_programa']
# jornada = row['jornada']
# modalidad = row['modalidad']
# no_de_graduados = int(row['no_de_graduados']) if 'no_de_graduados' in row else None
# row_data = (id, vigencia, nombre_facultad, nombre_programa, jornada, modalidad, no_de_graduados)
# cursor.execute(sql_insert, row_data)
# Función para procesar la API y almacenar los datos en MySQL
# def process_api(api_url, cursor, db):
# try:
# response = requests.get(api_url)
# response.raise_for_status() # Lanza una excepción para códigos de estado de respuesta HTTP no exitosos
# data = response.json()
# for row in data:
# process_row(row, cursor)
# db.commit()
# print(f'Datos de la tabla exportados correctamente a la base de datos MySQL')
# except requests.RequestException as e:
# print(f'Error de solicitud para {api_url}: {str(e)}')
# except mysql.connector.Error as e:
# print(f'Error de MySQL: {str(e)}')
# except Exception as e:
# print(f'Error general: {str(e)}')
# Función principal
# def main():
# try:
# db = mysql.connector.connect(**db_config)
# cursor = db.cursor()
# process_api(api_url, cursor, db)
# except mysql.connector.Error as e:
# print(f'Error de MySQL: {str(e)}')
# finally:
# if 'cursor' in locals() and cursor is not None:
# cursor.close()
# if 'db' in locals() and db.is_connected():
# db.close()
# if __name__ == "__main__":
# main()
Resultado en python:
Después de extraer los datos, procedimos a MySQL, donde almacenamos los resultados del web scraping.
Después de extraer los datos, se procedió a utilizar Clever Cloud para subir los datos en línea. Para ello, se realizaron los siguientes pasos:
1. Se seleccionó la opción "Create" y luego "Add-on".
2. Se eligió el complemento MySQL.
3. Se optó por la versión gratuita "DEV".
4. Se asignó el nombre "grados" a la base de datos y se seleccionó la ubicación "Montreal".
5. Se accedió a la información de la base de datos y se ingresó a PHPMyAdmin.
6. Usando PHPMyAdmin se ingresó al servidor.
7. Se copió la primera parte del script de creación de la tabla "graduados" en el editor SQL.
8. Se procedió con la ejecución de la consulta SQL para crear la tabla.
9. Se verificó la estructura de la tabla graduados y se confirmó su creación.
10. Se copió desde el comando "INSERT INTO" hasta el final de los datos extraídos.
11. Se pegó el script SQL en el editor de SQL de Clever Cloud y se ejecutó.
12. Se realizó una revisión final en el panel de administración para confirmar que los datos se cargaron correctamente.
Después de cargar los datos en Clever Cloud, se pueden realizar análisis de datos mediante los siguientes ejercicios:
Se instala mysql-connector-python para conectar MySQL.
pip install mysql-connector-python
Collecting mysql-connector-python Downloading mysql_connector_python-9.0.0-cp310-cp310-manylinux_2_17_x86_64.whl.metadata (2.0 kB) Downloading mysql_connector_python-9.0.0-cp310-cp310-manylinux_2_17_x86_64.whl (19.3 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 19.3/19.3 MB 37.2 MB/s eta 0:00:00 Installing collected packages: mysql-connector-python Successfully installed mysql-connector-python-9.0.0
Se importa bibliotecas para análisis gráfico y datos.
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import mysql.connector
import numpy as np
Se define la función para conectar MySQL.
def connect_to_database():
return mysql.connector.connect(
host="bnvbikebwlzc7dpiqrxa-mysql.services.clever-cloud.com",
database="bnvbikebwlzc7dpiqrxa",
user="upibrhhbw3vgse5z",
password="3HMRCE2U6P6d081q7VcC"
)
Se procede a conecta MySQL, se ejecuta la consulta y se devuelve resultados como DataFrame.
def run_query(query1):
db = connect_to_database()
cursor = db.cursor()
cursor.execute(query1)
result = cursor.fetchall()
cursor.close()
db.close()
return pd.DataFrame(result)
La consulta query1 selecciona los programas académicos cuyos nombres comienzan con "maes", "especi" o "doc", calculando la suma total de graduados para cada programa. Los resultados se agrupan por nombre de programa y se ordenan de manera descendente según el total de graduados. Finalmente, se limita la salida a los 10 programas con el mayor número de graduados. La consulta se ejecuta utilizando la función run_query(query1), y los resultados se almacenan en el DataFrame df1 para su posterior análisis y visualización.
query1 = """
SELECT nombre_programa, SUM(no_de_graduados) AS total_graduados
FROM graduados
WHERE nombre_programa LIKE 'maes%' OR nombre_programa LIKE 'especi%' OR nombre_programa LIKE 'doc%'
GROUP BY nombre_programa
ORDER BY total_graduados DESC
LIMIT 10;
"""
df1 = run_query(query1)
Se realiza un gráfico de barras horizontal personalizado.
plt.figure(figsize=(10, 8))
plt.barh(df1[0], df1[1], color='blue', edgecolor='black')
plt.xlabel('Número de Graduados')
plt.ylabel('Programa')
plt.title('Programas con Mayor Número de Graduados')
plt.gca().invert_yaxis()
plt.show()
Conclusión: El análisis del gráfico programas con mayor número de graduados en Colombia (2020-2022), se observa una clara tendencia hacia la preferencia por programas de posgrado relacionados con las áreas de administración, negocios y educación. Esta inclinación se observa en la cantidad de graduados en estos programas, lo que refleja su alta demanda y las atractivas oportunidades laborales que ofrecen en el contexto colombiano.
Por otro lado, los programas de especialización muestran un número superior de graduados en comparación de los programas de maestría, posiblemente debido a su duración más corta y costos más accesibles en relación con las maestrías.
Se procede a conecta MySQL, se ejecuta la consulta y se devuelve resultados como DataFrame.
def run_query(query2):
db = connect_to_database()
cursor = db.cursor()
cursor.execute(query2)
result = cursor.fetchall()
cursor.close()
db.close()
return result
El código ejecuta una consulta SQL, query2, para obtener el nombre de programas de posgrado en ingeniería y el total de graduados de cada programa. Utiliza condiciones LIKE para seleccionar programas cuyos nombres comienzan con "maestri", "espec", o "doc" seguidos de "Ingeniería". Los resultados se agrupan por nombre de programa y se ordenan de manera descendente según el total de graduados.
query2 = """
SELECT nombre_programa, SUM(no_de_graduados) AS total_graduados
FROM graduados
WHERE (nombre_programa LIKE 'maestri%Ingeniería%'
OR nombre_programa LIKE 'espec%Ingeniería%'
OR nombre_programa LIKE 'doc%Ingeniería%')
GROUP BY nombre_programa
ORDER BY total_graduados DESC
LIMIT 10;
"""
result = run_query(query2)
Se realiza un gráfico de barras horizontal personalizado.
df = pd.DataFrame(result, columns=['nombre_programa', 'total_graduados'])
plt.figure(figsize=(12, 8))
plt.barh(df['nombre_programa'], df['total_graduados'], color='gold', edgecolor='black')
plt.xlabel('Número de Graduados')
plt.ylabel('Programa de Estudio')
plt.title('Programas con mayor Número de Graduados en Ingenierías (Maestrías, Especializaciones y Doctorados)')
plt.gca().invert_yaxis()
plt.show()
Conclusión: El análisis del gráfico sobre los programas con mayor número de graduados en ingenierías en Colombia revela una tendencia predominante hacia las maestrías, seguidas de especializaciones y doctorados.
Esto refleja una alta demanda de profesionales altamente capacitados en diversas disciplinas de la ingeniería. Los programas más populares incluyen especialización en ingeniería de producción y operaciones, maestría en ingeniería ambiental y maestría en ingeniería, destacando la preferencia por formaciones generalistas y especializadas que abordan áreas clave como la ambiental, la empresarial y la de infraestructura vial.
Se procede a conecta MySQL, se ejecuta la consulta y se devuelve resultados como DataFrame.
def run_query(query3):
db = connect_to_database()
cursor = db.cursor()
cursor.execute(query3)
result = cursor.fetchall()
cursor.close()
return result
El código ejecuta una consulta SQL, query3, para obtener la suma total de graduados por año (vigencia) desde la tabla graduados. Los resultados se agrupan por año y se calcula el total de graduados para cada año.
query3 = """
SELECT vigencia, SUM(no_de_graduados) AS total_graduados
FROM graduados
GROUP BY vigencia;
"""
result = run_query(query3)
Se realiza un gráfico de barras por año.
df = pd.DataFrame(result, columns=['vigencia', 'total_graduados'])
print(df)
plt.figure(figsize=(10, 8))
colors = plt.get_cmap('tab10').colors
bars = plt.bar(df['vigencia'], df['total_graduados'], color=colors[:len(df['vigencia'])], edgecolor='black')
for bar in bars:
yval = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2, yval, yval, ha='center', va='bottom', fontsize=12)
plt.xlabel('Vigencia')
plt.ylabel('Número de Graduados')
plt.title('Número de Graduados por Vigencia')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
vigencia total_graduados 0 PRIMER SEMESTRE 2020 394 1 SEGUNDO SEMESTRE 2020 3852 2 PRIMER SEMESTRE 2021 2433 3 SEGUNDO SEMESTRE 2021 1153 4 PRIMER SEMESTRE 2022 1360
Conclusión: El análisis del gráfico número de graduados por vigencia revela una tendencia decreciente en el número de graduados a lo largo de cinco periodos desde el Primer Semestre de 2020 hasta el Primer Semestre de 2022. Este descenso puede atribuirse a varios factores como la pandemia de COVID-19, que probablemente afectó la asistencia y finalización de estudios debido a restricciones y medidas sanitarias. Además, cambios en las políticas de la institución y condiciones económicas adversas podrían haber contribuido a esta disminución. Estos elementos sugieren la necesidad de adaptación y apoyo continuo para los estudiantes en tiempos de crisis y cambios institucionales.
Daniela Stephania Lombana Garcia
Para llevar a cabo la visualización de datos, se emplearon los datos combinados obtenidos mediante el merge. Estos datos fueron importados a Tableau Public, una potente herramienta de visualización de datos. En Tableau Public, se realizaron varias representaciones gráficas para analizar la información de manera efectiva. Se crearon gráficos de barras para observar las variaciones en diferentes categorías y gráficos circulares para representar proporciones de manera intuitiva. Además, se presentaron datos en tablas para proporcionar una visión detallada y numérica de los resultados. Esta combinación de gráficos y tablas permitió una comprensión más profunda de los datos y facilitó la interpretación de las tendencias y patrones presentes en la información analizada.
Para llevar a cabo la visualización de datos, se siguieron los siguientes pasos:
1. Acceso a Tableau Public: Primero, nos dirigimos a la página de Tableau Public y seleccionamos la opción para crear un nuevo proyecto.
2. Carga de datos: Luego, cargamos los datos combinados obtenidos mediante el merge. En esta etapa, verificamos que las columnas requeridas estuvieran presentes y que la información se hubiera importado correctamente.
3. Creación de visualizaciones: A continuación, comenzamos a crear diversas representaciones gráficas. Se generaron tablas para mostrar los datos de manera detallada y se crearon gráficos de barras y gráficos circulares para visualizar las tendencias y proporciones de manera efectiva.
4. Exploración del Dashboard: Para ver los resultados finales y explorar el dashboard completo, por favor, acceda al enlace proporcionado. Este enlace le permitirá visualizar las visualizaciones y tablas interactivas creadas en Tableau Public.
Acceda al dashboard haciendo clic en el enlace "Tableau Public Dashboard Posgrados":